package NGUYENVANDOAN.XMLDEMO.SAMPLE;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class MODELS {
    
    /***
     * Nghiệp vụ đọc dữ liệu trong files XML có sẵn
     * @param lisField - Chứa danh sách các trường dữ liệu. Chỉ số = 0 dành cho Node Atribute Key.
     * @param elementNode - Phần tử Node con của Root Node. Ví dụ: <iMIC><Student></Student></iMIC> --> Root Node = "iMIC" & Element Node = "Student"
     * @param path - Chứa đường dẫn resource. Ví dụ: "D:imic/xml/Student.xml"
     * @return List<List<HashMap<String, String>>>
     * @throws Exception 
     */
    public List<List<HashMap<String, String>>> 
                XMLOfItems(List<Object> lisField,
                                             String elementNode, String path)
                                                                     throws Exception {
        
        //Khai báo & khởi tạo các đối tượng
        List<List<HashMap<String, String>>> lisHash = 
                        new ArrayList<List<HashMap<String, String>>>();
        List<HashMap<String, String>> lisTemp = 
                        new ArrayList<HashMap<String, String>>();
        try{       
                // 1. Khởi tạo đối tượng files (tham chiếu tới files)
                File fXmlFile = new File(path);        
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = null;       
        
                // 2. Kiểm tra files trước khi bindding dữ liệu trong files XML vào
                // Documents
                if (fXmlFile.exists()) {
                    doc = dBuilder.parse(fXmlFile);                      
                    doc.getDocumentElement().normalize();            
                    //3. Lấy ra danh sách phần tử "Student"
                    NodeList nList = doc.getElementsByTagName(elementNode); 
                    
                    //4. Khai báo và khởi tạo HashMap            
                    HashMap<String, String> objHash = null;
                    
                    int iItems = nList.getLength();              
                    // 4. Duyệt danh sách phần tử trong nList 
                    String key = "";
                    String value = "";
                    for (int j = 0; j < iItems; j++) {
                        Node nNode = nList.item(j);                              
                        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                            Element eElement = (Element) nNode;
                            objHash = new HashMap<String, String>();
                              
                            for(int k = 0;k<lisField.size();k++){
                                if(k==0){
                                    //Identify atribute key - Id
                                    key =  ""+lisField.get(k);
                                    value = ""+eElement.getAttribute(""+lisField.get(k));
                                    objHash.put(key, value);
                                }
                                else{
                                    //Node items in Element Node
                                    key =  ""+lisField.get(k);
                                    value = ""+eElement.getElementsByTagName(
                                                        ""+lisField.get(k)).
                                                        item(0).getTextContent();
                                    objHash.put(key, value);
                                }
                            }
                            //5. Gắn thông tin vào List<HashMap<String, String>>
                            lisTemp.add(objHash);                                       
                        }                
                    }
                    //6. Add các List<HashMap<String, String>> vào trong 
                            //List<List<HashMap<String, String>>>
                    lisHash.add(lisTemp);
                }
                else{
                    return null;
                }
        } catch (Exception e) {
            throw e;
        }
        return lisHash;
    }
}
